package com.ghf.dp3.first;

public class Main {
    // Component 定义一个对象接口，可以给这些对象动态地添加职责
    // ConcreteComponent 是定义了一个具体的对象，给这个对象添加一些职责
    // Decorator 装饰抽象类
    // ConcreteDecoratorA ConcreteDecoratorB 具体的装饰对象,给Component添加职责的功能
    public static void main(String[] args) {
        //先实例化 Component,然后用 ConcreteDecoratorA 实例化对象d1包装c,再用ConcreteDecoratorB实例化对象d2包装d1,执行d2.Operation()
        //利用SetComponent来对对象进行包装,执行顺序 c.Operation -> d1.Operation -> d2.Operation
        //每个装饰对象的实现就和如何使用这个对象分离开了，装饰对象只关心自己的功能，不需要关心如何被添加到对象链当中，执行顺序根据添加对象链顺序决定
        ConcreteComponent c = new ConcreteComponent();
        ConcreteDecoratorA d1 = new ConcreteDecoratorA();
        ConcreteDecoratorB d2 = new ConcreteDecoratorB();

        d1.setComponent(c);
        d2.setComponent(d1);

        d2.Operation();
    }
}
